/*
 * Copyright 2016 atnoce.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.atnoce.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 *
 * @author Administrator
 */
public class FileMd5 {
    
    public static String fileMD5(File inputFile) throws IOException, NoSuchAlgorithmException {
		long a=(new FileInputStream(inputFile).available())/1024L/1024L;
		if(a>=10){
			//System.out.println("超出文件大小限制");
			return null;
		}
	      // 缓冲区大小（这个可以抽出一个参数）
	      int bufferSize = 256 * 1024;
	      FileInputStream fileInputStream = null;
	      DigestInputStream digestInputStream = null;
	      try {
	         // 拿到一个MD5转换器（同样，这里可以换成SHA1）
	         MessageDigest messageDigest =MessageDigest.getInstance("MD5");
	         // 使用DigestInputStream
	         fileInputStream = new FileInputStream(inputFile);
	         digestInputStream = new DigestInputStream(fileInputStream,messageDigest);
	         // read的过程中进行MD5处理，直到读完文件
	         byte[] buffer =new byte[bufferSize];
	         while (digestInputStream.read(buffer) > 0);
	         // 获取最终的MessageDigest
	         messageDigest= digestInputStream.getMessageDigest();
	         // 拿到结果，也是字节数组，包含16个元素
	         byte[] resultByteArray = messageDigest.digest();
	         // 同样，把字节数组转换成字符串
	         return byteArrayToHex(resultByteArray);
	      } catch (NoSuchAlgorithmException e) {
	         return null;
	      } finally {
	         try {
	            digestInputStream.close();
	         } catch (Exception e) {
	         }
	         try {
	            fileInputStream.close();
	         } catch (Exception e) {
	         }
	      }
	   }
	 //下面这个函数用于将字节数组换成成16进制的字符串

	   public static String byteArrayToHex(byte[] byteArray) {
	        String hs = "";   
	        String stmp = "";   
	        for (int n = 0; n < byteArray.length; n++) {   
	            stmp = (Integer.toHexString(byteArray[n] & 0XFF));   
	            if (stmp.length() == 1) {   
	                hs = hs + "0" + stmp;   
	            } else {   
	                hs = hs + stmp;   
	            }   
	            if (n < byteArray.length - 1) {   
	                hs = hs + "";   
	            }   
	        }   
	        return hs;

	}
}
